package com.sys.service.impl;

import com.bhudy.base.BaseServiceImpl;
import com.bhudy.base.QueryFilter;
import com.sys.entity.SysMenu;
import com.sys.service.SysMenuService;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.*;

/**
 * @Author com.bhudy
 * @Description 菜单管理Service实现类
 * @Date 2019-10-30 23:09:37
 */
@Service
public class SysMenuServiceImpl extends BaseServiceImpl<SysMenu, Serializable> implements SysMenuService {

    private QueryFilter queryFilter = new QueryFilter();

    @Override
    public List<SysMenu> findTree() {
        try {
            queryFilter.clear();
            queryFilter.and("type", 1);

            //查询所有菜单
            List<SysMenu> allMenu = super.findList(queryFilter);
            //根节点
            List<SysMenu> rootMenu = new ArrayList<>();
            for (SysMenu nav : allMenu) {
                if (nav.getParentId() != null && nav.getParentId().equals(0L)) {//父节点是0的，为根节点。
                    rootMenu.add(nav);
                }
            }
            /* 根据Menu类的order排序 */
            Collections.sort(rootMenu, order());
            //为根菜单设置子菜单，getClild是递归调用的
            for (SysMenu nav : rootMenu) {
                /* 获取根节点下的所有子节点 使用getChild方法*/
                List<SysMenu> childList = getChild(nav.getId(), allMenu);
                nav.setChildrenMenuList(childList);//给根节点设置子节点
            }

            return rootMenu;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取子节点
     *
     * @param id      父节点id
     * @param allMenu 所有菜单列表
     * @return 每个根节点下，所有子菜单列表
     */
    public List<SysMenu> getChild(Long id, List<SysMenu> allMenu) {
        //子菜单
        List<SysMenu> childList = new ArrayList<>();
        for (SysMenu nav : allMenu) {
            // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            //相等说明：为该根节点的子节点。
            if (nav.getParentId() != null && nav.getParentId().equals(id)) {
                childList.add(nav);
            }
        }
        //递归
        for (SysMenu nav : childList) {
            nav.setChildrenMenuList(getChild(nav.getId(), allMenu));
        }
        Collections.sort(childList, order());//排序
        //如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size() == 0) {
            return null;//new ArrayList<SysMenu>();
        }
        return childList;
    }

    /**
     * 排序,根据order排序
     */
    public Comparator<SysMenu> order() {
        return new Comparator<SysMenu>() {
            @Override
            public int compare(SysMenu o1, SysMenu o2) {
                if (o1 != null && !o1.getMenuOrder().equals(o2.getMenuOrder())) {
                    return o1.getMenuOrder() - o2.getMenuOrder();
                }
                return 0;
            }
        };
    }

}
